跳到主要内容

2.3-React Native

React Native 相对于原生 IOS、Android 有哪些优、劣势?

优势

  • 性能方面接近原生 App。
  • 绝大部分代码同时适用IOS/Android,一套代码两套系统适用。
  • 已有 react 应用的前提下,改造为 app 耗时更小。
  • 使用 Javascript 编码,上手容易。
  • 组件式开发,易于管理维护,代码复用率高。
  • 代码更改后会自动刷新,节省等待时间。
  • 支持热更新,更新无需重新安装App

劣势

  • RN组件库不全,第三方组件库也不全,当遇到某些特殊功能,需要花费大量时间、精力完成;性能方面也无法媲美原生,还是会有一些损耗,特别是大数据交换时;
  • 系统适配方面, IOS 版本略好,android 发展较慢;
  • 编程方面, iosandroid 代码并非通用,有可能需要维护两套代码或者在代码中做一些条件判断或编译;
  • 开发人员还是需要会原生开发,不然自定义组件无法编码;
  • 开发复杂应用必须精通原生开发,开发效率并不比原生开发的熟手快。很多问题(包括兼容性问题解决)任然需要原生开发。
  • 升级RN版本或需要大动干戈,尤其向下兼容不好;

setState 调用后发生了什么?

  • 将传入的参数对象与当前的状态合并,然后触发调和过程。
  • 在调和过程中 react 会根据新的状态以相对高效的方式构建react元素树。
  • react 会对新旧元素树进行 diff 算法 计算出差异,然后根据差异进行最小化渲染。

InteractionManager

InteractionManager 可以将一些耗时较长的工作安排到所有互动或动画后执行,这样可以保证JS动画的流畅性。

requestAnimationFrame(): 用来执行在一段时间内控制视图动画的代码。

setImmediate/setTimeout(): 在稍后执行代码。注意这有可能会延迟当前正在进行的动画。

runAfterInteractions():在稍后执行代码,不会延迟当前进行的动画。

缓存

AsyncStorage 它是一个简单、异步、持久化的键值对存储系统,它对于App来说是全局的。可以用来替代LocalStorage

官网推荐在此基础上封装一层,不要直接使用。

  • IOS上,AsyncStorage 在原生端的实现是把较小值存放在序列化的字典中,而把较大值写入单独的文件。
  • Android上,AsyncStorage 会尝试使用 RocksDB,或退而选择 SQLite